#include <SFML/Graphics.hpp>
#include <iostream>
#include "metod.h"
#include "secondary_functions.h"

using namespace sf;
using namespace std;

int main() {
    const int SIZE = 3; // Размер игрового поля (3x3)
    const int CELL_SIZE = 300; // Размер ячейки (крестика/нолика)
    const int WINDOW_SIZE = SIZE * CELL_SIZE; // Размер окна

    Texture fon; //создаём фон
    fon.loadFromFile("Image/fon.png");
    Sprite fon_sprite;
    fon_sprite.setTexture(fon);

    int position; //клетка в которую пк должен поставить нолик
    int hod = 0;
    int check = 0; // в случае победы станет 1

    RenderWindow window(VideoMode(WINDOW_SIZE, WINDOW_SIZE), "Krestili-noliki");

    Texture crossTexture, circleTexture;
    if (!crossTexture.loadFromFile("Image/krest.png") || !circleTexture.loadFromFile("Image/krug.png")) {
        cerr << "Failed to load texture." << endl;
        return 1;
    }

    Sprite crossSprite(crossTexture), circleSprite(circleTexture);
    crossSprite.setScale((float)CELL_SIZE / crossTexture.getSize().x, (float)CELL_SIZE / crossTexture.getSize().y);
    circleSprite.setScale((float)CELL_SIZE / circleTexture.getSize().x, (float)CELL_SIZE / circleTexture.getSize().y);

    int board[SIZE][SIZE] = {0}; // Игровое поле: 0 - пусто, 1 - крестик, 2 - нолик
    int currentPlayer = 1; // Идентификатор текущего игрока: 1 - крестик, 2 - нолик

    while (window.isOpen()) {
        window.draw(fon_sprite);
        Event event;
        while (window.pollEvent(event)) {
            if (event.type == Event::Closed)
                window.close();
            else if (event.type == Event::MouseButtonPressed && event.mouseButton.button == Mouse::Left) {
                int x = event.mouseButton.x / CELL_SIZE;
                int y = event.mouseButton.y / CELL_SIZE;

                if (x >= 0 && x < SIZE && y >= 0 && y < SIZE && board[y][x] == 0) {
                    board[y][x] = currentPlayer;
                    hod++;
                    check = check_vin(board, hod);
                    if (check == 0){
                        algoritm(board, hod);
                    }
                    //print(board, hod);
                    check = vin(board);
                    if (check == 0) { check = vin_igrok(board); }

                }
            }
        }

        window.clear(Color::White);

        // Отрисовка игрового поля
        for (int i = 0; i < SIZE; ++i) {
            for (int j = 0; j < SIZE; ++j) {
                if (board[i][j] == 1) {
                    crossSprite.setPosition(j * CELL_SIZE, i * CELL_SIZE);
                    window.draw(crossSprite);
                } else if (board[i][j] == 2) {
                    circleSprite.setPosition(j * CELL_SIZE, i * CELL_SIZE);
                    window.draw(circleSprite);
                }
            }
        }

        if (check == 1){
            sf::Font font;
            if (!font.loadFromFile("vcrosdmonorusbyd.ttf")) {
                // Обработка ошибки загрузки шрифта
                return EXIT_FAILURE;
            }
            sf::Text text;
            text.setFont(font); // Задаем шрифт
            text.setString("The program has won!"); // Устанавливаем текст
            text.setCharacterSize(60); // Устанавливаем размер шрифта
            text.setFillColor(sf::Color::Red); // Устанавливаем цвет текста
            window.draw(text);
        }
        if (check == 2){
            sf::Font font;
            if (!font.loadFromFile("vcrosdmonorusbyd.ttf")) {
                // Обработка ошибки загрузки шрифта
                return EXIT_FAILURE;
            }
            sf::Text text;
            text.setFont(font); // Задаем шрифт
            text.setString("You have won!"); // Устанавливаем текст
            text.setCharacterSize(60); // Устанавливаем размер шрифта
            text.setFillColor(sf::Color::Red); // Устанавливаем цвет текста
            window.draw(text);
        }

        window.display();

        if (Keyboard::isKeyPressed(Keyboard::R)) {
            // Сброс игрового поля и счётчика ходов
            for (int i = 0; i < SIZE; ++i) {
                for (int j = 0; j < SIZE; ++j) {
                    board[i][j] = 0;
                }
            }
            hod = 0;
            check = 0;
        }

    }

    return 0;
}
